import torch
import torchvision


# 加载了经过预训练的 resnet18 模型。
# 我们创建一个随机数据张量来表示具有 3 个通道的单个图像，高度&宽度为 64，
# 其对应的label初始化为一些随机值。
model = torchvision.models.resnet18(pretrained=True)
data = torch.rand(1, 3, 64, 64)
labels = torch.rand(1, 1000)

prediction = model(data)  # forward pass
loss = (prediction - labels).sum()  # 计算损失
loss.backward()  # backward pass
# 当我们在误差张量上调用.backward()时，开始反向传播。
# 然后，Autograd 会为每个模型参数计算梯度并将其存储在参数的.grad属性中。

# 加载一个优化器，在本例中为 SGD，学习率为 0.01，动量为 0.9。
# 我们在优化器中注册模型的所有参数。
optim = torch.optim.SGD(model.parameters(), lr=1e-2, momentum=0.9)
optim.step()  # 启动梯度下降。 优化器通过.grad中存储的梯度来调整每个参数。
